﻿///
/// \file std_def.h
/// \brief 标准通用自定义数据类型头文件
///
/// \author 李荣业
/// \version V1.0
/// \date 2018.09.03
///

#ifndef STD_DEF_H  // STD_DEF_H
#define STD_DEF_H

/// id
typedef unsigned long TId;

/// handle
typedef unsigned long THandle;

#define INVALID_VALUE_UL    0xFFFFFFFF
#define INVALID_VALUE_US    0xFFFF
#define INVALID_VALUE       -1

#define STR(arg) STR1(arg)
#define STR1(arg) STR2(arg)
#define STR2(arg) #arg
#define CASE_2_TEXT_RETURN(value)   case (value): return STR(value)

/********************************* 错误码 操作(交易或执行)结果 begin *********************************/
typedef enum EErrorCode
{
    ERROR_SUCCESS0   = 0,           //成功，可表示通用的成功
    ERROR_FAIL      = 1,            //失败，可表示通用的失败
    ERROR_UNKNOWN_ERROR,
    ERROR_USER_NOT_FOUND,           //用户账号不存在(不对)
    ERROR_PASSWD_ERROR,             //密码错误
    ERROR_PERMISSION_DENIED,        //5 没有权限

    ERROR_DATA_FORMAT_ERROR,             //数据格式错误
    ERROR_FUNCTION_NOT_SUPPORTED,        //功能不支持
    ERROR_HEAD_FORMAT_ERROR,             //包头格式错误
    ERROR_CHECK_CODE_FAIL,               //校验码失败(校验码可以是校验和，CRC校验等)
    ERROR_PACK_SIZE_TOO_BIG,             //   10 协议包太长

    ERROR_PACK_CMD_UNKNOWN,     //包的cmd是未知的
    ERROR_BAD_PARAMETER,        //函数传入参数错误，或初始化参数不对
    ERROR_SERVER_NOT_RESPONSE,  //服务器完全无响应
    ERROR_SERVER_NOT_REPLY,     //服务器没有回复(发送成功，但未收到反馈)
    ERROR_TERM_NOT_RESPONSE,    //终端完全无响应   15

    ERROR_TERM_NOT_REPLY,       //终端无回复(发送成功，但未收到反馈)
    ERROR_DATA_BASE_ERROR,      //数据库错误
    ERROR_NO_MEMORY,            //内存不足，比如申请内存失败
    ERROR_ALREADY_INITIALIZED0,  //已经初始化了，不需要再次初始化
    ERROR_INVALID_DESCRIPTOR,   //无效的文件(或套接字)描述符    20

    ERROR_SYSCALL_FAIL,             //系统调用失败
    ERROR_CREATE_THREAD_FAIL,       //创建线程失败
    ERROR_SET_THREAD_DETACH_FAIL,   //设置线程分离属性失败
    ERROR_RECV_DATA_TIMEOUT,        //接收数据超时
    ERROR_TAIL_FORMAT_ERROR,        //包尾格式错误    25

    ERROR_SEND_DATA_FAIL,           //发送数据失败
    ERROR_CREATE_FILE_FAIL,         //创建文件失败
    ERROR_DEL_FILE_FAIL,            //删除文件失败
    ERROR_OPEN_FILE_FAIL,           //打开文件失败
    ERROR_CLOSE_FILE_FAIL,          //关闭文件失败    30

    ERROR_READ_FILE_FAIL,   //读文件失败
    ERROR_WRITE_FILE_FAIL,  //写文件失败
    ERROR_QUEUE_FULL,       //队列已满
    ERROR_QUEUE_EMPTY,      //队列已空
    ERROR_QUEUE_BUSY,       //队列忙    35

    ERROR_LOGIN_PASSWD_ERROR,   //登录密码错误
    ERROR_NO_ENOUGH_SPARE_BUF,  //没有足够多的空闲缓冲区
    ERROR_THIRD_CALL_FAIL,      //调用第三方函数失败
    ERROR_NET_DISCONNECTED,     //网络连接已断开
    ERROR_READ_IO_FAIL,         //读I/O设备失败  40  I/O设备不可用时read函数会返回此值

    ERROR_WRITE_IO_FAIL,                //写I/O口失败
    ERROR_READ_PUBLIC_DATA_FAIL,        //读公共数据失败
    ERROR_WRITE_PUBLIC_DATA_FAIL,       //写公共数据失败
    ERROR_INVALID_OPERATION0,            //无效的操作
    ERROR_DATA_FIELD_SIZE_INCORRECT,    //包的数据域大小与协议规定不符    45

    ERROR_SIGNAL_REGISTRATION_FULL,         //信号已经注册(完了)满了
    ERROR_SIGNAL_SLOT_ALREADY_CONNECTED,    //信号与槽已经连接了
    ERROR_SIGNAL_SLOT_CONNECTION_POOL_FULL, //信号与槽连接池已满
    ERROR_NO_SUCH_SIGNAL_SLOT_CONNECTION,   //信号与槽未连接或找不到对应的连接
    ERROR_FILE_NAME_SIZE_BEYOND_LIMIT,      //文件名超过限制   50

    ERROR_SAVE_RECORD_FAIL,             //保存记录失败
    ERROR_RESOURCES_BUSY,               //资源忙
    ERROR_GET_PTR_HANDLE_FAIL,          //获取指针句柄失败，指针句柄为空
    ERROR_RECV_DATA_FAIL,               //接收数据失败, 网络断开时接收函数recv会返回此值
    ERROR_PACK_CMD_ALREADY_REGISTERED,  //包的cmd已经被注册了   55

    ERROR_PACK_CMD_UNREGISTERED,    //包的cmd未注册
    ERROR_ALREADY_REGISTERED0,       //已经注册了，可通用表示任何注册行为
    ERROR_UNREGISTERED_FAIL,        //注册失败
    ERROR_LOGIN_FAIL,               //登录失败
    ERROR_SET_SYSTEM_TIME_FAIL,     //设置系统时间失败      60

    ERROR_NO_FREE_HANDLES,  /* Cannot open device again   */
    ERROR_INVALID_HANDLE0,   /* Handle is not valid        */
    ERROR_INVALID_ID,       /* ID is not valid        */
    ERROR_TIMEOUT0,          /* Timeout occured            */
    ERROR_DEVICE_BUSY,      /* Device is currently busy   65 */

    ERROR_NO_INIT,                  /* not init    */
    ERROR_BEYOND_MAX_COUNT,         /* that more than max count    */
    ERROR_BEYOND_MIN_COUNT,         /* that more than max count    */
    ERROR_LOCK_FAIL,                /* 加锁失败    */
    ERROR_UNLOCK_FAIL,              /* 解锁失败    70 */

    ERROR_STATE_ERROR,              //状态异常(错误)
    ERROR_NULL_POINTER,             //空指针
    ERROR_BAD_PARAM_NULL_PTR,       //传入参数为空指针
    ERROR_FUNC_RETURN_NULL_PTR,     //调用的函数返回空指针
    ERROR_COUNT_ERROR,              //数量不对(错误)      75

    ERROR_NO_ENOUGH_MONEY,          //没有足够的钱，余额不足
    ERROR_REPETITIVE_OPERATION,     //重复的操作
    ERROR_PARAMETER_NOT_COMPLETE,   //参数不完整
    ERROR_LENGTH_INCORRECT,         //长度不正确
    ERROR_DEVICE_NOT_AVAILABLE0,     //设备不可用     80

    ERROR_TASK_BEING_PERFORMED,         //任务正在执行中
    ERROR_NOT_FOUND0,                   //没有找到
    ERROR_OPERA_FILE_FAIL,              //操作文件失败
    ERROR_TYPE_INCORRECT,               //类型不正确
    ERROR_OPEN_DEVICE_FAIL,             //打开设备失败    85

    ERROR_ALREADY_STARTED,              //已经启动了，不需要再次启动
    ERROR_ALREADY_STOPPED,              //已经停止了，不需要再次停止
    ERROR_PEER_ADDR_INCORRECT,          //对端地址不正确，多用于通信，如socket，can等
    ERROR_GET_FAIL,                     //获取失败
    ERROR_SET_FAIL,                     //设置失败      90

    ERROR_PEER_EXEC_FAIL,               //对端执行失败，返回错误结果，多用于通信，如socket，can等
    ERROR_CHECK_FAIL,                   //校验失败, 如ID校验失败等
    ERROR_ADDRESS_ERROR,                //地址不正确, 如寄存器地址、内存地址等
    ERROR_SWITCH_UNKNOWN_CASE,          //switch 未知的 case 值
    ERROR_RETRY_LATER,                  //当前不方便执行操作，请稍后重试   95

    ERROR_OPERATION_NOT_ALLOWED,        //操作不允许
    ERROR_FINAL_FAIL,                   //最终的失败，不需要再重试了
    ERROR_DEVICE_NOT_FOUND,             //设备未找到
    ERROR_DYNAMIC_CAST_ERROR,           //dynamic_cast类型转换出错
    ERROR_PEER_NOT_RESPONSE,           // 对端完全无响应    100

    ERROR_GAME_OVER,

    ERROR_CAMERA_OPEN_FAIL = 501,         // 相机打开失败
    ERROR_CAMERA_NOT_READY,         // 相机未就绪
    ERROR_CAMERA_PHOTO_FAILED,         // 相机拍照失败
    ERROR_NO_TEMPLATE,              // 没有模板
    ERROR_IMAGE_ERROR,              // 图像错误   505

    ERROR_POSITION_OUT_RANGE,              // 位置超出范围

} EErrorCode;

static const char * ErrorText(int error_code)
{
    switch (error_code)
    {
        CASE_2_TEXT_RETURN(ERROR_SUCCESS0);
        CASE_2_TEXT_RETURN(ERROR_FAIL);
        CASE_2_TEXT_RETURN(ERROR_UNKNOWN_ERROR);
        CASE_2_TEXT_RETURN(ERROR_USER_NOT_FOUND);
        CASE_2_TEXT_RETURN(ERROR_PASSWD_ERROR);
        CASE_2_TEXT_RETURN(ERROR_PERMISSION_DENIED);  //   5

        CASE_2_TEXT_RETURN(ERROR_DATA_FORMAT_ERROR);
        CASE_2_TEXT_RETURN(ERROR_FUNCTION_NOT_SUPPORTED);
        CASE_2_TEXT_RETURN(ERROR_HEAD_FORMAT_ERROR);
        CASE_2_TEXT_RETURN(ERROR_CHECK_CODE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_PACK_SIZE_TOO_BIG);  //   10

        CASE_2_TEXT_RETURN(ERROR_PACK_CMD_UNKNOWN);
        CASE_2_TEXT_RETURN(ERROR_BAD_PARAMETER);
        CASE_2_TEXT_RETURN(ERROR_SERVER_NOT_RESPONSE);
        CASE_2_TEXT_RETURN(ERROR_SERVER_NOT_REPLY);
        CASE_2_TEXT_RETURN(ERROR_TERM_NOT_RESPONSE);  //   15

        CASE_2_TEXT_RETURN(ERROR_TERM_NOT_REPLY);
        CASE_2_TEXT_RETURN(ERROR_DATA_BASE_ERROR);
        CASE_2_TEXT_RETURN(ERROR_NO_MEMORY);
        CASE_2_TEXT_RETURN(ERROR_ALREADY_INITIALIZED0);
        CASE_2_TEXT_RETURN(ERROR_INVALID_DESCRIPTOR);  //    20

        CASE_2_TEXT_RETURN(ERROR_SYSCALL_FAIL);
        CASE_2_TEXT_RETURN(ERROR_CREATE_THREAD_FAIL);
        CASE_2_TEXT_RETURN(ERROR_SET_THREAD_DETACH_FAIL);
        CASE_2_TEXT_RETURN(ERROR_RECV_DATA_TIMEOUT);
        CASE_2_TEXT_RETURN(ERROR_TAIL_FORMAT_ERROR);  //    25

        CASE_2_TEXT_RETURN(ERROR_SEND_DATA_FAIL);
        CASE_2_TEXT_RETURN(ERROR_CREATE_FILE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_DEL_FILE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_OPEN_FILE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_CLOSE_FILE_FAIL);  //    30

        CASE_2_TEXT_RETURN(ERROR_READ_FILE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_WRITE_FILE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_QUEUE_FULL);
        CASE_2_TEXT_RETURN(ERROR_QUEUE_EMPTY);
        CASE_2_TEXT_RETURN(ERROR_QUEUE_BUSY);  //    35

        CASE_2_TEXT_RETURN(ERROR_LOGIN_PASSWD_ERROR);
        CASE_2_TEXT_RETURN(ERROR_NO_ENOUGH_SPARE_BUF);
        CASE_2_TEXT_RETURN(ERROR_THIRD_CALL_FAIL);
        CASE_2_TEXT_RETURN(ERROR_NET_DISCONNECTED);
        CASE_2_TEXT_RETURN(ERROR_READ_IO_FAIL);  //  40

        CASE_2_TEXT_RETURN(ERROR_WRITE_IO_FAIL);
        CASE_2_TEXT_RETURN(ERROR_READ_PUBLIC_DATA_FAIL);
        CASE_2_TEXT_RETURN(ERROR_WRITE_PUBLIC_DATA_FAIL);
        CASE_2_TEXT_RETURN(ERROR_INVALID_OPERATION0);
        CASE_2_TEXT_RETURN(ERROR_DATA_FIELD_SIZE_INCORRECT);  //    45

        CASE_2_TEXT_RETURN(ERROR_SIGNAL_REGISTRATION_FULL);
        CASE_2_TEXT_RETURN(ERROR_SIGNAL_SLOT_ALREADY_CONNECTED);
        CASE_2_TEXT_RETURN(ERROR_SIGNAL_SLOT_CONNECTION_POOL_FULL);
        CASE_2_TEXT_RETURN(ERROR_NO_SUCH_SIGNAL_SLOT_CONNECTION);
        CASE_2_TEXT_RETURN(ERROR_FILE_NAME_SIZE_BEYOND_LIMIT);  //   50

        CASE_2_TEXT_RETURN(ERROR_SAVE_RECORD_FAIL);
        CASE_2_TEXT_RETURN(ERROR_RESOURCES_BUSY);
        CASE_2_TEXT_RETURN(ERROR_GET_PTR_HANDLE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_RECV_DATA_FAIL);
        CASE_2_TEXT_RETURN(ERROR_PACK_CMD_ALREADY_REGISTERED);  //   55

        CASE_2_TEXT_RETURN(ERROR_PACK_CMD_UNREGISTERED);
        CASE_2_TEXT_RETURN(ERROR_ALREADY_REGISTERED0);
        CASE_2_TEXT_RETURN(ERROR_UNREGISTERED_FAIL);
        CASE_2_TEXT_RETURN(ERROR_LOGIN_FAIL);
        CASE_2_TEXT_RETURN(ERROR_SET_SYSTEM_TIME_FAIL);  //      60

        CASE_2_TEXT_RETURN(ERROR_NO_FREE_HANDLES); /* Cannot open device again   */
        CASE_2_TEXT_RETURN(ERROR_INVALID_HANDLE0); /* Handle is not valid        */
        CASE_2_TEXT_RETURN(ERROR_INVALID_ID);      /* ID is not valid        */
        CASE_2_TEXT_RETURN(ERROR_TIMEOUT0);        /* Timeout occured            */
        CASE_2_TEXT_RETURN(ERROR_DEVICE_BUSY);     /* Device is currently busy   65 */

        CASE_2_TEXT_RETURN(ERROR_NO_INIT);          /* not init    */
        CASE_2_TEXT_RETURN(ERROR_BEYOND_MAX_COUNT); /* that more than max count */
        CASE_2_TEXT_RETURN(ERROR_BEYOND_MIN_COUNT); /* that more than max count */
        CASE_2_TEXT_RETURN(ERROR_LOCK_FAIL);
        CASE_2_TEXT_RETURN(ERROR_UNLOCK_FAIL); /*     70 */

        CASE_2_TEXT_RETURN(ERROR_STATE_ERROR);
        CASE_2_TEXT_RETURN(ERROR_NULL_POINTER);
        CASE_2_TEXT_RETURN(ERROR_BAD_PARAM_NULL_PTR);
        CASE_2_TEXT_RETURN(ERROR_FUNC_RETURN_NULL_PTR);
        CASE_2_TEXT_RETURN(ERROR_COUNT_ERROR);  //      75

        CASE_2_TEXT_RETURN(ERROR_NO_ENOUGH_MONEY);
        CASE_2_TEXT_RETURN(ERROR_REPETITIVE_OPERATION);
        CASE_2_TEXT_RETURN(ERROR_PARAMETER_NOT_COMPLETE);
        CASE_2_TEXT_RETURN(ERROR_LENGTH_INCORRECT);
        CASE_2_TEXT_RETURN(ERROR_DEVICE_NOT_AVAILABLE0);  //     80

        CASE_2_TEXT_RETURN(ERROR_TASK_BEING_PERFORMED);
        CASE_2_TEXT_RETURN(ERROR_NOT_FOUND0);
        CASE_2_TEXT_RETURN(ERROR_OPERA_FILE_FAIL);
        CASE_2_TEXT_RETURN(ERROR_TYPE_INCORRECT);
        CASE_2_TEXT_RETURN(ERROR_OPEN_DEVICE_FAIL);  //    85

        CASE_2_TEXT_RETURN(ERROR_ALREADY_STARTED);
        CASE_2_TEXT_RETURN(ERROR_ALREADY_STOPPED);
        CASE_2_TEXT_RETURN(ERROR_PEER_ADDR_INCORRECT);
        CASE_2_TEXT_RETURN(ERROR_GET_FAIL);
        CASE_2_TEXT_RETURN(ERROR_SET_FAIL);  //      90

        CASE_2_TEXT_RETURN(ERROR_PEER_EXEC_FAIL);
        CASE_2_TEXT_RETURN(ERROR_CHECK_FAIL);
        CASE_2_TEXT_RETURN(ERROR_ADDRESS_ERROR);
        CASE_2_TEXT_RETURN(ERROR_SWITCH_UNKNOWN_CASE);
        CASE_2_TEXT_RETURN(ERROR_RETRY_LATER);  //   95

        CASE_2_TEXT_RETURN(ERROR_OPERATION_NOT_ALLOWED);
        CASE_2_TEXT_RETURN(ERROR_FINAL_FAIL);
        CASE_2_TEXT_RETURN(ERROR_DEVICE_NOT_FOUND);
        CASE_2_TEXT_RETURN(ERROR_DYNAMIC_CAST_ERROR);
        CASE_2_TEXT_RETURN(ERROR_PEER_NOT_RESPONSE);  //    100

        CASE_2_TEXT_RETURN(ERROR_GAME_OVER);

        CASE_2_TEXT_RETURN(ERROR_CAMERA_OPEN_FAIL);  //    501
        CASE_2_TEXT_RETURN(ERROR_CAMERA_NOT_READY);
        CASE_2_TEXT_RETURN(ERROR_CAMERA_PHOTO_FAILED);
        CASE_2_TEXT_RETURN(ERROR_NO_TEMPLATE);
        CASE_2_TEXT_RETURN(ERROR_IMAGE_ERROR);  //    505

        CASE_2_TEXT_RETURN(ERROR_POSITION_OUT_RANGE);

    default: return "Unknown error code";
    }
}
/********************************* 错误码 操作(交易或执行)结果 end *********************************/

#endif  // STD_DEF_H
